﻿#ifndef ITESTFLOW_H
#define ITESTFLOW_H

#include <QString>
#include <QSharedPointer>
#include <memory>
#include "common/datatypes.h"

namespace Exec {
struct Subrange;
struct TestPlan;
using TestPlanPtr = QSharedPointer<const TestPlan>;
} // namespace Exec

// 会话抽象基类：每个流程实现自己的派生类，内部保存本流程所需的设备句柄
struct TestFlowSession {
    virtual ~TestFlowSession() = default;

    // 将所有可能产生射频输出的设备静默（RF Off/功放待机等）
    virtual void safeMuteAllOutputs() = 0;
    virtual bool ensureOutputsEnabled() = 0;
    // 彻底关闭/释放所有设备/句柄
    virtual void closeAll() = 0;

    // 作为“唯一硬件键”的对比依据（常用 sr.hw.data() 或硬件ID）
    const void *hardwareKey = nullptr;
};
using TestFlowSessionPtr = std::shared_ptr<TestFlowSession>;

// 测试流程策略接口（抽象）
class ITestFlow
{
public:
    virtual ~ITestFlow() = default;

    // 流程名称（用于日志/诊断）
    virtual QString name() const = 0;
    virtual void setPlanOptions(const FlowPlanOptions &opts) = 0;

    // 确保会话：根据子区间（含硬件）创建/复用流程会话（设备对象）
    virtual bool ensureSessionsForSubrange(const Exec::Subrange &subrange,
                                           TestFlowSessionPtr reuseCandidate,
                                           TestFlowSessionPtr &outSession,
                                           TestFlowCallbacks callbacks,
                                           QString &errorMessage) = 0;

    // 安全静默：关闭发射、功放待机等
    virtual void safeMuteAllOutputs(const TestFlowSessionPtr &session) = 0;

    virtual bool measureOnePoint(const Exec::Subrange &subrange,
                                 int frequencyIndex,
                                 const TestFlowSessionPtr &session,
                                 TestFlowCallbacks callbacks,
                                 QString &errorMessage) = 0;
};

std::unique_ptr<ITestFlow> createTestFlow(HardwareTemplateType flowKind);

#endif // ITESTFLOW_H
